<?php

/** 
 * @class XQL_Connection
 * @extends pObject
 *
 */
class XQL_Connection
{
	/**
	 * A kapcsolatot felvevő PDO objektum.
	 * @var PDO
	 */
	public $pdo;

	/**
	 * A rendszer által ezen a kapcsolaton keresztül elért táblanevek prefix-e.
	 * @var string
	 */
	public $tablePrefix;

	/**
	 * A kapcsolat létrehozásához használt PDO osztály neve.
	 * @var string
	 */
	public $pdoClassName;

	/**
	 * Az URI formátum szerint meghatározott kapcsolatelérési beállítás
	 * {@link http://php.net/parse_url parse_url()} által adott tömb típusú
	 * kimenete.
	 * @var array
	 */
	public $connectionString;

	/**
	 * Az adatbázis kapcsolat beállításainak a rendszer által az eléréséhez
	 * használt azonosító (álnév).
	 * @var string
	 */
	public $alias;

	/**
	 * A kapcsolat létrehozásakor alkalmazott PDO attribútumok. Csak az "ATTR_"
	 * kezdetűek értendőek idetartozónak!
	 * @var array
	 * @link http://php.net/manual/en/pdo.constants.php
	 */
	public $attributes;

	/**
	 * A kapcsolatfelvétel után egyszer lefutó lekérések, szöveges típussal.
	 * @var array
	 */
	public $afterConnect;

	/**
	 * Az SQL tranzakciók engedélyezése vagy tiltása a kapcsolaton.
	 * @var bool
	 */
	protected $transactions = FALSE;

	/**
	 * Konstruktor.
	 * Eltárolja a beállítási értékeket és példányosítja a kiszolgáló eléréséhez
	 * használt (a konfiguráció alapján meghatározott nevű) PDO objektumot.
	 * A PDO objektum példányosítását követően lefuttatja a
	 * {@link $afterConnect kapcsolatfelvétel után futtatandó lekéréseket}.
	 *
	 * @param string $alias A kapcsolat álneve.
	 * @param array $configSettings A kapcsolatra vonatkozó konfigurációs
	 * beállítások (sm_settings/database.ini.php)
	 */
	public function __construct($alias, $configSettings)
	{
		$this->pdoClassName = $configSettings->pdoClass;
		$this->connectionString = parse_url($configSettings->access);
		$this->alias = $alias;
		$this->tablePrefix = $configSettings->tablePrefix;
		$this->attributes = $configSettings->attributes;
		$this->afterConnect = $configSettings->setupQueries;
		$this->pdo = new $this->pdoClassName(
			$this->connectionString['scheme'].':host='.
			$this->connectionString['host'].';dbname='.
			substr($this->connectionString['path'], 1),
			$this->connectionString['user'],
			$this->connectionString['pass'],
			(array)$this->attributes
		);
		
		foreach ($this->attributes as $attr=>$value)
		{
			if (is_string($attr)) $attr = constant($attr);
			$this->pdo->setAttribute($attr, $value);
		} // foreach
		
		foreach ($this->afterConnect as $query)
		{
			$this->pdo->query($query);
		} // foreach
	}

	/**
	 * Destruktor.
	 * Az objektum megsemmisítése előtt lezárja a kapcsolatot (felszabadítja a
	 * PDO objektumot).
	 */
	public function __destruct()
	{
		unset($this->pdo, $this->tablePrefix, $this->pdoClassName, $this->connectionString, $this->alias);
	}

	/**
	 * Tranzakciót kezdeményez a kapcsolaton.
	 */
	public function transactionOpen()
	{
		$this->transactions = TRUE;
		$this->pdo->beginTransaction();
	}

	/**
	 * Lezárja a kapcsolaton kezdeményezett tranzakciót (commit-ot hajt végre).
	 */
	public function transactionClose()
	{
		$this->transactions = FALSE;
		$this->pdo->commit();
	}

	/**
	 * Visszavonja a tranzakció nyitás óta kiküldött lekéréseket (rollback) és
	 * lezárja a tranzakciót a kapcsolaton.
	 */
	public function transactionCancel()
	{
		$this->transactions = FALSE;
		$this->pdo->rollBack();
	}
}

?>